package com.zx.onlineeducation.test;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.fill.Property;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * MyBatisPlus代码生成器
 * 
 * @author 郑雪
 * @since 2022-01-07
 */
public class CodeGenerator {

    /**
     * 指定输出目录
     */
    static final String OUT_PUT_DIR = "E:\\workspace_study\\workspace_idea\\online-education\\guli-parent\\service\\service-edu\\src\\main\\java";

    /**
     * 设置mapperXml生成路径
     */
    static final String MAPPER_XML_OUT_PUT_DIR = "E:\\workspace_study\\workspace_idea\\online-education\\guli-parent\\service\\service-edu\\src\\main\\resources\\mybatis\\mapper";

    /**
     * 设置父包名
     */
    static final String PARENT_PACKAGE_NAME = "com.zx.onlineeducation.service";

    /**
     * 设置父包模块名
     */
    static final String PARENT_PACKAGE_MODULE_NAME = "edu";

    /**
     * 设置需要生成的表名
     */
    static final List<String> TABLE_NAME_LIST = Arrays.asList("edu_course", "edu_course_description", "edu_chapter", "edu_video");

    /**
     * 设置过滤表前缀
     */
    static final String TABLE_PREFIX ="edu_";

    public static void main(String[] args) {
        FastAutoGenerator.create(
                "jdbc:mysql://localhost:3306/project_online_education?serverTimezone=GMT%2B8",
                "root", "123456")

                // 全局配置
                .globalConfig(builder -> {
                    builder.author("郑雪")                   // 设置作者
                            .enableSwagger()                // 开启 swagger 模式
                            .fileOverride()                 // 覆盖已生成文件
                            .disableOpenDir()               // 禁止打开输出目录
                            .dateType(DateType.ONLY_DATE)   // 时间策略
                            //.commentDate("yyyy-MM-dd")    // 注释日期
                            .outputDir(OUT_PUT_DIR);        // 指定输出目录
                })

                // 包配置
                .packageConfig(builder -> {
                    builder.parent(PARENT_PACKAGE_NAME)                 // 设置父包名
                            .moduleName(PARENT_PACKAGE_MODULE_NAME)     // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,
                                    MAPPER_XML_OUT_PUT_DIR));           // 设置mapperXml生成路径
                })

                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(TABLE_NAME_LIST)                 // 设置需要生成的表名
                            .addTablePrefix(TABLE_PREFIX)               // 设置过滤表前缀
                    // Entity 策略配置
                    .entityBuilder().enableLombok()                     // 开启 lombok 模型
                                    .enableRemoveIsPrefix()             // 开启 Boolean 类型字段移除 is 前缀
                                    .versionColumnName("version")       // 乐观锁字段名(数据库)
                                    .logicDeleteColumnName("is_deleted")// 逻辑删除字段名(数据库)
                                    .addTableFills(
                                            new Property("createTime", FieldFill.INSERT),
                                            new Property("updateTime", FieldFill.INSERT_UPDATE)
                                        )                               // 添加表字段填充
                                    .idType(IdType.ASSIGN_ID)           // 全局主键类型
                                    .formatFileName("%sDO")             // 格式化文件名称
                    // Controller 策略配置
                    .controllerBuilder().enableRestStyle()              // 开启生成@RestController 控制器
                                        .enableHyphenStyle()            //开启驼峰转连字符
                    // Service 策略配置
                    .serviceBuilder().formatServiceFileName("%sService")// 格式化 service 接口文件名称
                            ;

                })
                //.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板

                // 执行
                .execute();
    }
}
